package net.zoneland.zrdp.framework.web.service;

import javax.servlet.http.HttpServletRequest;

import com.fasterxml.jackson.core.JsonProcessingException;
import net.zoneland.zrdp.common.core.domain.model.LoginUser;

/**
 * TokenService API.
 */
public interface TokenService {

    /**
     * 获取用户身份信息.
     *
     * @param request - 请求对象.
     * @return 存在返回用户信息, 不存在返回null. 注意出于性能考虑,实现会设计request/jvm多级缓存机制.
     */
    LoginUser getLoginUser(HttpServletRequest request);

    /**
     *  获取用户身份信息.
     * @param request  - 请求对象.
     * @param headerInToken - 是否从header中获取, 默认为true.
     * @return 存在返回用户信息, 不存在返回null. 注意出于性能考虑,实现会设计request/jvm多级缓存机制.
     */
    LoginUser getLoginUser(HttpServletRequest request, boolean headerInToken);

    LoginUser getCachedUser(HttpServletRequest request, String token);
    LoginUser getUserFromToken(final String token) throws JsonProcessingException;
    /**
     * 删除用户身份信息.
     */
    void delLoginUser(LoginUser user);

   /**
     * 创建令牌
     *
     * @param loginUser 用户信息
     * @return 令牌
     */
    String createToken(final LoginUser loginUser);

   /**
     * 验证令牌有效期，相差不足20分钟，自动刷新缓存
     *
     * @param loginUser 登录用户
     */
    void verifyToken(final LoginUser loginUser);

    void refreshToken(final LoginUser loginUser);

    /**
     * 设置用户身份信息
     */
    void setLoginUser(LoginUser loginUser);

    /**
     * @return  返回是否启用了jvm级缓存.
     */
    boolean isCacheOnJvm();

    /**
     * 启用或禁用jvm级缓存.
     * 注意仅在CaffeineCacheManager存在场景才实际有效.
     * @param cacheOnJvm - true为启用, false为禁用.
     * @return 返回是否启用了jvm级缓存.
     */
    boolean setCacheOnJvm(boolean cacheOnJvm);

    /**
     * 清除内存的token缓存.
     */
    void evictUserCacheOnJvm(String token);
}
